home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 050 / ippon050.lzh / sound.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  4KB  |  180 lines

  1. /* sound.c */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "main.h"
  7. #include "zmcall.h"
  8.  
  9. #define SE_MAX    32
  10. #define MUSIC_MAX    16
  11.  
  12.  
  13. static void *se_ptr[SE_MAX];    /* 読み込んだ .PCM データへのポインタ */
  14. static int se_size[SE_MAX];    /* ↑       のサイズ */
  15. static short se_no = 0;        /* 鳴らす効果音の番号 */
  16. static char zmusic_keep = 0;    /* ZMUSIC が常駐しているか */
  17.  
  18. static void *music_ptr[MUSIC_MAX];    /* 読み込んだ .ZMD データへのポインタ */
  19. static int music_size[MUSIC_MAX];    /* ↑       のサイズ */
  20.  
  21. extern void Tini (void);
  22.  
  23.  
  24.  
  25. /* 起動時に1回だけ呼ばれる */
  26. int SoundInit (void)
  27. {
  28.     FILE *fp, *fp2;
  29.     int data_no;
  30.     char str1[1024];
  31.     int i;
  32.  
  33.     for (i = 0; i < SE_MAX; i++)
  34.         se_ptr[i] = NULL;
  35.     for (i = 0; i < MUSIC_MAX; i++)
  36.         music_ptr[i] = NULL;
  37.  
  38.     /* SOUND.CNF 読み込み */
  39.     fp = fopen ("SOUND.CNF", "r");
  40.     if (fp == NULL) {
  41.         error_level = ERROR_SOUND;
  42.         error_message = "SOUND.CNF が読み込めません\n";
  43.         Tini ();    /* 返ってこない */
  44.     }
  45.     while (fscanf (fp, "%s", str1) != EOF) {
  46.         if (ferror (fp) || feof (fp))
  47.             break;
  48.         if (!strcmpi (str1, "SE")) {
  49.             fscanf (fp, "%d %s", &data_no, &str1);
  50.             fp2 = fopen (str1, "rb");
  51.             if (fp2 == NULL) {
  52.                 static char e[256];
  53.                 error_level = ERROR_SOUND;
  54.                 error_message = e;
  55.                 sprintf (e, "ファイル %s が読み込めません\n", str1);
  56.                 Tini ();    /* 返ってこない */
  57.             }
  58.             fseek (fp2, 0, SEEK_END);
  59.             se_size[data_no] = ftell (fp2);
  60.             fseek (fp2, 0, SEEK_SET);
  61.             se_ptr[data_no] = malloc (se_size[data_no]);
  62.             if (se_ptr[data_no] == NULL) {
  63.                 error_level = ERROR_FILE;
  64.                 error_message = "効果音用メモリが足りません\n";
  65.                 Tini ();    /* 返ってこない */
  66.             }
  67.             fread (se_ptr[data_no], se_size[data_no], 1, fp2);
  68.             fclose (fp2);
  69.             fgets (str1, 1024, fp);        /* 以下読み捨てる */
  70.             continue;
  71.         }
  72.         if (!strcmpi (str1, "MUSIC")) {
  73.             fscanf (fp, "%d %s", &data_no, &str1);
  74.             fp2 = fopen (str1, "rb");
  75.             if (fp2 == NULL) {
  76.                 static char e[256];
  77.                 error_level = ERROR_SOUND;
  78.                 error_message = e;
  79.                 sprintf (e, "ファイル %s が読み込めません\n", str1);
  80.                 Tini ();    /* 返ってこない */
  81.             }
  82.             fseek (fp2, 0, SEEK_END);
  83.             music_size[data_no] = ftell (fp2);
  84.             fseek (fp2, 0, SEEK_SET);
  85.  
  86.             music_ptr[data_no] = malloc (music_size[data_no]);
  87.             if (music_ptr[data_no] == NULL) {
  88.                 error_level = ERROR_FILE;
  89.                 error_message = "音楽用メモリが足りません\n";
  90.                 Tini ();    /* 返ってこない */
  91.             }
  92.             fread (music_ptr[data_no], music_size[data_no], 1, fp2);
  93.             fclose (fp2);
  94.             fgets (str1, 1024, fp);        /* 以下読み捨てる */
  95.             continue;
  96.         }
  97.         fgets (str1, 1024, fp);        /* 以下読み捨てる */
  98.         if (ferror (fp) || feof (fp))
  99.             break;
  100.     }
  101.     fclose (fp);
  102.  
  103.     if (ZmKeepCheck ()) {
  104.         error_level = ERROR_SOUND;
  105.         error_message = "ZMUSIC が常駐していません\n";
  106.         Tini ();    /* 返ってこない */
  107.     } else {
  108.         zmusic_keep = !0;
  109.         ZmInit ();
  110.     }
  111.  
  112.     return (0);
  113. }
  114.  
  115.  
  116.  
  117. /* 効果音をセットする(けど鳴らさない) */
  118. void SoundSetSE (short no)
  119. {
  120.     /* 優先順位を判定 */
  121.     if (no > se_no)
  122.         se_no = no;
  123. }
  124.  
  125.  
  126. /* 効果音を鳴らす */
  127. void SoundMove (void)
  128. {
  129.     if (se_no) {
  130.         if (se_ptr[se_no])
  131.             ZmAdpcmSE (se_ptr[se_no], se_size[se_no], 4 * 256 + 3, se_no);
  132.         se_no = 0;
  133.     }
  134. }
  135.  
  136.  
  137.  
  138. /* 音楽を鳴らす */
  139. void SoundMusic (int no)
  140. {
  141.     if (music_ptr[no])
  142.         ZmPlay (music_ptr[no], music_size[no]);
  143. }
  144.  
  145.  
  146.  
  147. /* 音楽をフェードアウトする */
  148. void SoundFadeOut (int no)
  149. {
  150.     ZmFadeOut (no);
  151. }
  152.  
  153.  
  154.  
  155. /* 音楽を止める */
  156. void SoundStop (void)
  157. {
  158.     ZmStop ();
  159. }
  160.  
  161.  
  162.  
  163. /* 終了時に1回だけ呼ばれる */
  164. void SoundTini (void)
  165. {
  166.     int i;
  167.  
  168.     if (zmusic_keep)
  169.         ZmFadeOut (64);
  170.  
  171.     for (i = 0; i < SE_MAX; i++) {
  172.         if (se_ptr[i] != NULL)
  173.             free (se_ptr[i]);
  174.     }
  175.     for (i = 0; i < MUSIC_MAX; i++) {
  176.         if (music_ptr[i] != NULL)
  177.             free (music_ptr[i]);
  178.     }
  179. }
  180.